import { baseRouter, asyncRouterMap } from '@/router/router.config';

/**
 * 过滤账户是否拥有某一个权限，并将菜单从加载列表中移除
 * @param permission
 * @param route
 * @returns {boolean}
 */
function hasPermission(permission,route){
    if(route.meta&&route.meta.permission){
        let flag = false;
        for(let i = 0,len = permission.length;i < len;i++){
            flag = route.meta.permission.includes(permission[i]);
            if (flag) {
                return true;
            }
        }
        return false;
    }
    return true;
}
/**
 * 单账户多角色时，使用该方法可过滤角色不存在的菜单
 *
 * @param roles
 * @param route
 * @returns {*}
 */
// eslint-disable-next-line
function hasRole(roles, route) {
    if (route.meta && route.meta.roles) {
        return route.meta.roles.includes(roles.id);
    } else {
        return true;
    }
}

function filterAsyncRouter (routerMap, roles) {
    const accessedRouters = routerMap.filter(route => {
      if (hasPermission(roles.permissionList, route)) {
        if (route.children && route.children.length) {
          route.children = filterAsyncRouter(route.children, roles);
        }
        return true;
      }
      return false;
    })
    return accessedRouters;
}

const permission={
    state:{
        routers:baseRouter,
        addRouters:[],
        firstInter:false,//判断在当前页面是否第一次登陆，开发环境下确认加载完成路由与使用
    },
    mutations:{
        SET_ROUTERS:(state,routers)=>{
            state.addRouters=routers;
            state.routers=baseRouter.concat(routers);
        },
        SET_INTER:(state,data)=>{
            state.firstInter=data;
        }
    },
    actions:{
        GenerateRoutes({commit},data){
            return new Promise(resolve=>{
                const {roles} = data;
                const accessedRouters = filterAsyncRouter(asyncRouterMap,roles);
                commit('SET_ROUTERS', accessedRouters);
                resolve();
            })
        },
        /**
         * 开发环境环境下加载所有菜单
         * @param {*} param0 
         * @param {*} data 
         */
        addAllRoutes({commit},data){
            return new Promise(resolve=>{
                commit('SET_ROUTERS', asyncRouterMap);
                resolve();
            })
        }
    }
}


export default permission;